package com.ruoyi.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.domain.DailyReport;
import com.ruoyi.domain.ReportItem;
import com.ruoyi.enums.DailyReportStatus;
import com.ruoyi.mapper.DailyReportMapper;
import com.ruoyi.mapper.ReportItemMapper;
import com.ruoyi.service.DailyReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 日报管理模块 - 服务层实现类
 * 实现日报及其工作内容的业务逻辑
 */
@Service
public class DailyReportServiceImpl implements DailyReportService {

    @Autowired
    private DailyReportMapper dailyReportMapper;

    @Autowired
    private ReportItemMapper reportItemMapper;

    /**
     * 获取日报列表（分页和条件查询）
     *
     * @param params      查询参数（包含分页信息和过滤条件）
     * @param currentUser 当前登录用户（用于权限控制）
     * @return 分页后的日报数据
     */
    @Override
    public Map<String, Object> getReportList(Map<String, Object> params, SysUser currentUser) {
        // 判断是否为管理员
        boolean isAdmin = currentUser.isAdmin();

        // 获取查询参数
        String workerName = isAdmin ? (String) params.get("workerName") : null; // 仅管理员可查询其他用户
        Long userId = currentUser.getUserId(); // 当前用户 ID

        // 获取日期范围参数
        String startDate = (String) params.getOrDefault("startDate", null); // 开始日期
        String endDate = (String) params.getOrDefault("endDate", null); // 结束日期

        // 分页参数
        int pageNum = Integer.parseInt(params.getOrDefault("pageNum", "1").toString());
        int pageSize = Integer.parseInt(params.getOrDefault("pageSize", "10").toString());

        // 使用 PageHelper 进行分页
        PageHelper.startPage(pageNum, pageSize);

        List<DailyReport> reports;

        // **管理员查询逻辑**
        if (isAdmin) {
            reports = dailyReportMapper.getAdminReports(workerName, userId, startDate, endDate);
        } else {
            // **普通用户查询逻辑**
            reports = dailyReportMapper.getUserReports(userId, startDate, endDate);
        }

        // 使用 PageInfo 封装分页结果
        PageInfo<DailyReport> pageInfo = new PageInfo<>(reports);

        // 获取每个日报的工作内容(用来计算工作时长)
        for (DailyReport report : reports) {
            List<ReportItem> reportItems = reportItemMapper.getReportItemsByReportId(report.getId());
            report.setReportItems(reportItems); // 设置日报的工作内容列表
        }

        // 封装返回格式
        Map<String, Object> data = new HashMap<>();
        data.put("records", reports.stream().map(report -> {
            Map<String, Object> record = new HashMap<>();
            record.put("id", report.getId());
            record.put("workDate", report.getWorkDate());
            record.put("workerName", report.getWorkerName());
            record.put("workHours",
                    (report.getReportItems() != null
                            ? report.getReportItems().stream().mapToDouble(item -> item.getWorkHours() != null ? item.getWorkHours() : 0).sum()
                            : 0)); // 处理 reportItems 为 null 的情况
            record.put("createdAt", report.getCreatedAt());
            record.put("updatedAt", report.getUpdatedAt());
            record.put("status",
                    report.getStatus() != null ? Integer.parseInt(report.getStatus()) : -1); // 状态直接返回数字，-1表示未知状态
            return record;
        }).collect(Collectors.toList()));
        data.put("total", pageInfo.getTotal());

        return data;
    }






    /**
     * 新增日报
     *
     * @param report      日报对象
     * @param currentUser 当前登录用户（用于设置用户ID）
     * @return 操作结果
     */
    @Override
    @Transactional
    public AjaxResult addReport(DailyReport report, SysUser currentUser) {
        // 设置当前用户ID
        report.setUserId(currentUser.getUserId());

        // 插入日报数据
        dailyReportMapper.insertReport(report);

        // 如果日报包含工作内容，则批量插入工作内容
        if (report.getReportItems() != null && !report.getReportItems().isEmpty()) {
            for (ReportItem item : report.getReportItems()) {
                item.setReportId(report.getId()); // 设置关联的日报ID
            }
            reportItemMapper.insertReportItems(report.getReportItems());
        }

        return AjaxResult.success("新增日报成功！");
    }


    /**
     * 编辑日报
     *
     * @param id          日报ID
     * @param report      修改后的日报对象
     * @param currentUser 当前登录用户（用于权限校验）
     * @return 操作结果
     */
    @Override
    @Transactional
    public AjaxResult editReport(Long id, DailyReport report, SysUser currentUser) {

        // 确保日报ID和当前用户一致
        report.setId(id);
        report.setUserId(currentUser.getUserId());

        // 更新日报基本信息
        dailyReportMapper.updateReport(report);

        // 删除原有的工作内容
        reportItemMapper.deleteReportItemsByReportId(id);

        // 插入新的工作内容
        if (report.getReportItems() != null && !report.getReportItems().isEmpty()) {
            for (ReportItem item : report.getReportItems()) {
                item.setReportId(id); // 设置关联的日报ID
            }
            reportItemMapper.insertReportItems(report.getReportItems());
        }

        return AjaxResult.success("更新日报成功！");
    }

    /**
     * 删除日报
     *
     * @param id 日报ID
     * @return 操作结果
     */
    @Override
    public AjaxResult deleteReport(Long id) {
        // 删除日报
        dailyReportMapper.deleteReport(id);

        // 删除关联的工作内容
        reportItemMapper.deleteReportItemsByReportId(id);

        return AjaxResult.success("删除日报成功！");
    }

    /**
     * 获取单条日报详情
     *
     * @param id 日报ID
     * @return 日报详情（包含工作内容列表）
     */
    @Override
    public AjaxResult getReportDetails(Long id) {
        // 查询日报基本信息
        DailyReport report = dailyReportMapper.getReportDetails(id);

        if (report == null) {
            return AjaxResult.error("未找到对应的日报记录！");
        }

        // 查询关联的工作内容
        List<ReportItem> reportItems = reportItemMapper.getReportItemsByReportId(id);
        report.setReportItems(reportItems);

        return AjaxResult.success(report);
    }
}
